package com.java.jvm.oom;

import sun.misc.VM;

import java.nio.ByteBuffer;
import java.util.concurrent.TimeUnit;

/**
 * @author wangning
 * @date 2023/5/18 17:19
 * JVM的堆内存够用，但是外边的直接内存空间满了
 * 元空间并不在JVM中，而是在本地物理内存中，主要是直接操作内存导致的
 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m
 * Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
 */
public class DirectBufferMemoryDemo {
    public static void main(String[] args) {
        System.out.println("配置的MaxDirectMemorySize：" + (VM.maxDirectMemory() / (double) 1024 / 1024) + "MB");
        try {
            TimeUnit.SECONDS.sleep(3);

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //-XX:MaxDirectMemorySize=5m 我们配置为5MB，但实际使用6MB，故意使坏

        ByteBuffer bb = ByteBuffer.allocateDirect(6 * 1024 * 1024);//堆外，直接内存，会报异常
//        ByteBuffer bbb = ByteBuffer.allocate(6 * 1024 * 1024);//堆内
    }
}
